package com.gitee.huanminabc.fastboot.orm.sqlpaginator;

/**
 * Oracle 分页器实现
 */
public class OraclePaginator implements SqlPaginator {
    @Override
    public String paginate(String sql, int offset, int limit) {
        // Oracle 的 offset 是从 1 开始的记录行号，limit 是结束行号
        int startRow = offset + 1;
        int endRow = offset + limit;
        // **重要警告**: Oracle 的 ROW_NUMBER() 分页需要一个稳定的排序。
        // 如果原始 SQL (`sql`) 没有包含明确的、能确保唯一顺序的 ORDER BY 子句，
        // 那么分页结果在多次查询之间可能不一致！
        // `ORDER BY NULL` 是无效的，这里仅作语法占位符，依赖原始 SQL 的排序。
        // 最佳实践是在传入的 `sql` 中包含有效的 ORDER BY。
        return String.format(
                "SELECT * FROM (" +
                        " SELECT t.*, ROW_NUMBER() OVER (ORDER BY NULL) AS rn FROM (%s) t" +
                        " ) WHERE rn >= %d AND rn <= %d",
                sql, startRow, endRow
        );
        // 或者使用老式的 ROWNUM (同样需要内部排序)
        // return String.format(
        //    "SELECT * FROM ( SELECT t.*, ROWNUM rnum FROM (%s) t WHERE ROWNUM <= %d ) WHERE rnum >= %d",
        //    sql, endRow, startRow
        // );
    }
}